#include <iostream>
#include <span>
#include <vector>
#include <cstring>
#include <cassert>

/**
 * std::span  // 用于引用连续序列的轻量级对象，不拥有数据
 * 特别适合替代 (pointer, length) 这样的参数对
 */

// 传统方式，使用指针和长度参数对
class TraditionalBuffer
{
private:
    int *data;
    size_t length;

public:
    TraditionalBuffer(size_t size) : data(new int[size]), length(size) {}

    ~TraditionalBuffer() { delete[] data; }

    int *getData() { return data; }

    const int *getData() const { return data; }

    size_t getLength() const { return length; }
};

// 传统方式 需要同时传递指针和长度
void traditionalSum(const int *data, size_t length)
{
    int sum = 0;
    for (size_t i = 0; i < length; ++i)
    {
        sum += data[i];
    }
    std::cout << "traditional sum = " << sum << std::endl;
}

// 传统方式 容易出错的情况
void traditionalDangerous(const int *data, size_t length)
{
    for (size_t i = 0; i < length + 1; ++i) // 故意越界
    {
        std::cout << data[i] << std::endl;
    }
}

